<template>
  <div class=''>
    <el-card class="">
      <div slot="header" class="clearfix">
        <my-breadcrumb>素材管理</my-breadcrumb>
      </div>
      <div style="padding:20px">
        <el-radio-group v-model="collect" @change="hCollectChange">
          <el-radio-button :label="false">全部</el-radio-button>
          <el-radio-button :label="true">收藏</el-radio-button>
        </el-radio-group>
        <el-button type="success" style="float: right;" @click="dialogVisible = true">上传图片素材</el-button>
      </div>
      <!-- 图片列表 -->
      <el-row :gutter="10">
        <el-col
        class="img_item"
        v-for="(image, idx) in images"
        :key="image.id"
        :xs="12" :sm="6" :md="6" :lg="4">
          <el-image
            style="height: 180px;"
            :src="image.url"
            fit="cover"
          ></el-image>
          <div class="option" v-show="!collect">
            <!-- 是否收藏 只在全部选项卡可见，在收藏选项卡中不可见 -->
            <span :style="{color:image.is_collected ? 'red' : '#fff'}" class="el-icon-star-off" @click="hSwitchCollect(image)"></span>
            <span class="el-icon-delete" @click="hDeleteImage(image.id, idx)"></span>
          </div>
        </el-col>
      </el-row>
      <!-- 分页组件 current-change点击页码的时候会触发,并且会传入当前页码 :hide-on-single-page只有一页的时候隐藏分页-->
      <el-pagination
        background
        layout="prev, pager, next"
        :page-size="per_page"
        :total="total_count"
        style="margin-top:15px;"
        @current-change="hPageChange"
        :hide-on-single-page="true">
      </el-pagination>
    </el-card>
    <!-- 上传图片的对话框 append-to-body:让弹出层在最上面，不被其他元素挡住-->
    <el-dialog
      title="上传图片"
      :visible.sync="dialogVisible"
      :append-to-body="true"
      width="30%"
      >
      <!-- 必选参数action：上传的地址
      :show-file-list="false"不需要显示已上传的文件列表
      :on-success上传成功的回调函数
      :before-upload上传之前对文件进行检测
      name设置上传的文件字段名，要与接口文档的要求一致
      -->
      <el-upload
        class="avatar-uploader"
        action="http://ttapi.research.itcast.cn/mp/v1_0/user/images"
        :headers="headers"
        name="image"
        :show-file-list="false"
        :on-success="hUploadSuccess"
        :before-upload="beforeImageUpload">
        <!-- 当用户成功看到这张图的时候关闭对话框
        图片onload事件：当图片src加载成功时调用
        v-if和v-else二选一
        -->
        <el-image @load="hLoadImgOK" v-if="imgSrc" :src="imgSrc" class="avatar"></el-image>
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </el-dialog>
  </div>
</template>

<script>
// vuecli工具中，提供一个路径别名：@表示src/ 的绝对地址
import MyBreadcrumb from '@/components/MyBreadcrumb';
import { getImages, switchCollect, deleteImage } from '@/api/image.js';
import { getUser } from '@/utils/storage.js';
export default {
  name: 'ImageIndex',
  props: { },
  data () {
    return {
      imgSrc: null,
      // 由于这里的上传不是走的axios，而该处理需要token，所以手动添加
      headers: {
        Authorization: `Bearer ${getUser().token}`
      },
      dialogVisible: false, // 是否显示上传图片对话框
      images: [],
      collect: false, // 是否是收藏的图片，true是收藏，false是全部
      total_count: 0, // 本次查询的结果总数
      per_page: 10, // 每页显示10张图
      page: 1 // 默认当前第一页
    };
  },
  components: {
    MyBreadcrumb
  },
  computed: { },
  created () {
    this.loadImages();
  },
  mounted () { },
  methods: {
    // 封装加载图片方法
    async loadImages () {
      try {
        const res = await getImages({
          collect: this.collect,
          per_page: this.per_page,
          page: this.page
        });
        // 保存当前查询结果
        this.images = res.data.data.results;
        // 更新查询总结果数
        this.total_count = res.data.data.total_count;
      } catch (err) {
        console.log(err);
      }
    },
    // 翻页按钮
    hPageChange (curPage) {
      console.log(curPage);
      // 更新查询参数,重新发请求
      this.page = curPage;
      this.loadImages();
    },
    // 切换全部和收藏
    hCollectChange () {
      this.loadImages();
    },
    // 上传之前对文件进行检测
    beforeImageUpload (file) {
      const isJPG = file.type === 'image/jpeg' || 'image/png';
      const isLt2M = file.size / 1024 / 1024 < 2;

      if (!isJPG) {
        this.$message.error('上传图片只能是 JPG和PNG 格式!');
      }
      if (!isLt2M) {
        this.$message.error('上传图片大小不能超过 2MB!');
      }
      return isJPG && isLt2M;
    },
    // 上传图片成功回调函数
    hUploadSuccess (res, file) {
      // 在对话框中预览图片
      this.imgSrc = res.data.url;
      this.$message.success('上传素材成功!');
      this.loadImages();
    },
    hLoadImgOK () {
      // 用户已经成功看到加载好的图,2s以后关闭对话框
      setTimeout(() => {
        this.dialogVisible = false;
        this.imgSrc = null;
      }, 3000);
    },
    // 收藏/取消收藏
    async hSwitchCollect (image) {
      // switchCollect(图片id，是否收藏)
      // 对象解构赋值
      // const { id, is_collected: isCollected } = image;
      const { id, is_collected } = image;
      // 是否收藏要取反
      try {
        await switchCollect(id, !is_collected);
        this.$message.success('操作成功');
        // 更新视图,this.loadImages()重新更新整个图片成本高不经济，直接修改数据，数据驱动视图，视图也会改变
        image.is_collected = !is_collected;
      } catch (error) {
        this.$message.error('操作失败');
      }
    },
    // 删除图片
    hDeleteImage (id, idx) {
      this.$confirm('此操作将永久删除该文章, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        try {
          await deleteImage(id);
          this.$message.success('删除成功');
          // 更新页面
          // 找到这一项在当前数据项的索引值，直接删除视图的数据
          this.images.splice(idx, 1);
        } catch (error) {
          this.$message.error('删除失败');
        }
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    }
  }
};
</script>

<style scoped lang='less'>
.img_item {
  position: relative;
  box-sizing: border-box;
}
.option {
  position: absolute;
  left: 5px;
  right:5px;
  bottom: 5px;
  height: 30px;
  line-height: 30px;
  background: rgba(0, 0, 0, 0.3);
  text-align: center;
  color: #fff;
  span {
    margin: 0 30px;
    cursor: pointer;
  }
}
.avatar-uploader {
  text-align: center;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar-uploader /deep/ .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>
